package com.qz.sparsearray;


import com.qz.util.ArrayUtils;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

/**
 * @Description 稀疏数组
 * @Author Flag
 * @Date: 2021/7/3 14:54
 * @Version: 1.0
 **/
public class SparseArray {
    public static void main(String[] args) {

        //1.先创建一个原始得二维数组 11*11
        //0:表示没有棋子,1:表示黑子,2:表示蓝子
        int[][] chesssArr1 = new int [11][11];
        chesssArr1[1][2] = 1;
        chesssArr1[2][3] = 2;
        chesssArr1[4][5] = 2;
        //输出原始的二维数组
        System.out.println("原始得");
        ArrayUtils.printTwoDimensionArray(chesssArr1);



        /**
         * 将二维数组转变为稀疏数组
         * ==============================================================================================================
         */
        //1.先遍历二维数组，获取到其中元素个数
        int sum = 0;
        //1.1、遍历每一个行，
        for(int[] row : chesssArr1){
            //1.2、遍历每一个列
            for (int data : row) {
                //1.3、判断数据是否等于0，如果不是0，代表有数据，则数据总和sum++
                if(data != 0 ){
                    sum++;
                }
            }
        }

        System.out.println("数组中一共有:"+sum+"个元素");
        //2.构造一个稀疏数组:sum+1行,3列
        int[][] sparseArr = new int [sum+1][3];
        //3.将原始二维数组的数据添加到压缩列表中
        //3.1.1、第一行第一列是二维数组的总行
        sparseArr[0][0] = chesssArr1.length;
        //3.1.2、第一行第二列是二维数组的总列
        sparseArr[0][1] = chesssArr1[0].length;
        //3.1.3、第一行第三列是二维数组的有效数据个数
        sparseArr[0][2] = sum;

        //3.2.1、定义一个变量,用来存放稀疏数组存放到哪里了
        int count = 1;

        //3.2.2、遍历原始二维数组的每一行，获取到每一列
        for (int i = 0; i < chesssArr1.length; i++) {
            //3.2.3、遍历原始二维数组的每一列，获取到每一个元素
            for (int j = 0; j < chesssArr1[i].length; j++) {
                //3.2.4、判断对应的元素是否等于0，不等于0，则代表是有效数据，需要存储
                if (chesssArr1[i][j] != 0) {
                    //3.2.5、第count列的第一个元素是行号
                    sparseArr[count][0] = i;
                    //3.2.6、第count列的第二个元素是列号
                    sparseArr[count][1] = j;
                    //3.2.7、第count列的第三个元素是数据
                    sparseArr[count][2] = chesssArr1[i][j];
                    //3.2.8、元素计数器加一，代表新加了一个元素
                    count++;
                }
            }

        }
        //输出稀疏数组
        System.out.println("稀疏数组为:");
        ArrayUtils.printTwoDimensionArray(sparseArr);


        /**
         * 将稀疏数组恢复成原始的二维数组
         * ==============================================================================================================
         */
        //将稀疏数组恢复成原始的二维数组

        //4.1、通过稀疏数组构建原始二维数组；第一行第一列是总行数，第一行第一列是总列数
        int[][] chesssArr2 = new int [sparseArr[0][0]] [sparseArr[0][1]];
        //4.2、遍历每一个稀疏列表，然后进行赋值
        for (int i = 1; i < sparseArr.length; i++) {
            chesssArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }




    }

    public static void sparseArrayToIo(int[][] sparseArray) throws Exception {
        File file = new File("G:\\sparseArray.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        FileWriter writer = new FileWriter(file);
        for(int i =0; i < sparseArray.length; i++) {
            for(int j = 0; j < 3; j++) {
                writer.write(sparseArray[i][j]);
            }
        }
        writer.flush();
    }
    public static int[][] sparseArrayFromIo(int lineNums) throws Exception {

        FileReader reader = new FileReader("G:\\sparseArray.txt");
        int getNum = 0;
        int[][] sparseArray = new int[lineNums][3];
        for(int i = 0;i < lineNums;i++) {
            for (int j = 0; j < 3; j++) {
                getNum = reader.read();
                sparseArray[i][j] = getNum;
            }
        }
        return sparseArray;
    }


}
